<?php 
		$this->load->helper('regex_c_to_cplus');
		$this->load->model('M_mapping');
		$this->load->helper('c_keywords');

//------------------------------------------------CÁC FUNCTION DÙNG CHUNG----------------------------------------
		//Hàm lấy ra key c++ tương ứng với key c truyền vào
		function get_cpluskey($c_key)
		{
			$file = fopen('application/modules/ctocplus/models/Keys_C.txt',"r");
			while( !feof($file) )
			{
				$line = fgets($file);
				$keys = explode(":", $line);
					
				if($keys[0] == $c_key)
				{		
					return $this->cut_special_char($keys[1]);
				}
			}
			fclose($file);		
		}
		
		//Hàm loại bỏ ký tự đặc biệt
		function cut_special_char($code)
		{
			$code = trim(ltrim($code,$charlist = " \t\n\r\0\x0B"));
			return $code;
		}	
		
		//Hàm kiểm tra kết thúc 1 line có phải là dấu phẩy ( đối với line thường ) và ko cần dấu phẩy với
		//line có các key đặc biệt
		function check_finish_line($code)
		{			
			$code = $this->cut_special_char($code);
			
			preg_match(rex_for_keywords(), $code, $matches_key);
			preg_match(rex_for_calculations(), $code, $matches_cal);
			
			//Kiểm tra xem string truyền vào có thuộc ds các key mà cuối line ko cần dấu phẩy
			if(preg_match(rex_for_check_comma(),$matches_key[0]) || preg_match(rex_for_check_function(),$code))
			{
				return $code;
			}
			else if( (is_array(keywords()) && in_array($matches_key[0], keywords())) ||
					(is_array(calculations()) && in_array(trim($matches_cal[0]), calculations())) )
			{						
				if(substr($code, -1) != ";")
				{					
					return $code.ERROR_02;
				}	
				else 
					return "true";
			}
			else 
				return "false";			
		}
//END FUNCTIONS

//------------------------------------------------CÁC FUNCTION LIÊN QUAN ĐẾN FILE----------------------------------------
		
		//Hàm convert code file c sang c++
		function convert_File($code, $type)
		{
			//Trường hợp khởi tạo file
			if($type == "init")
			{
				$str = explode("*", $code);
				//Loại bỏ các khoảng trắng, ký tự xuống dòng, tab ...
				$key = cut_special_char($str[0]);
				
				return get_cpluskey($key)." ".$str[1];			 
			}
			//Trường hợp mở file
			else if($type == "open")
			{
				$str = explode("=", $code);
				$front = cut_special_char($str[0]);
				//Gọi tới hàm trong m_mapping để lấy ra key c++ tương ứng
				$key = get_cpluskey("fopen");
				//Lấy ra đoạn (...)
				$paren = preg_match(rex_for_behind_parentheses(), $str[1], $matches);
				$behind = explode(",", $matches[0]);
				return $front.".".$key.$behind[0].", ios::in | ios::out);";
			}
			//Trường hợp đóng file
			else if($type == "close")
			{
				$str = explode("(", $code);
				$var = substr($str[1], 0, -2);
				return $var.".".get_cpluskey("fclose").";";
			}
			//Trường hợp ghi file
			else if($type == "write")
			{
				$str = explode("(", $code);
				$str[0] = cut_special_char($str[0]);
				//Lấy ra key tương ứng
				$key = get_cpluskey($str[0]);
				
				preg_match(rex_for_behind_parentheses(), $code, $matches);
				
				$matches[0] = substr($matches[0], 1, -1);
				$array = explode(",", $matches[0]);			
				if($str[0] == "fprintf")
				{
					return cut_special_char($array[0])." ".$key.$array[1].";";
				}
				else if($str[0] == "fputs" || $str[0] == "fputc")
				{
					return cut_special_char($array[1])." ".$key.$array[0].";";
				}			
			}
			//Trường hợp đọc file
			else if($type == "read")
			{
				$str = explode("(", $code);
				$str[0] = cut_special_char($str[0]);
				//Lấy ra key tương ứng
				$key = get_cpluskey($str[0]);
				preg_match(rex_for_behind_parentheses(), $code, $matches);
				
				$matches[0] = substr($matches[0], 1, -1);
				$array = explode(",", $matches[0]);
				if($str[0] == "fscanf")
				{
					return cut_special_char($array[0])." ".$key.$array[2].";";
				}
				else if($str[0] == "fgets")
				{
					return cut_special_char($array[2])." ".$key.$array[0].";";
				}
			}
		}
//END FUNCTIONS		
		
//------------------------------------------------CÁC FUNCTION LIÊN QUAN ĐẾN INPUT OUTPUT----------------------------------------
		
		//Hàm lấy ra các biến truyền vào tham số chuỗi -- Trả về mảng chứa các biến
		function get_variable($code)
		{			
			$array = explode(",",$code);
			$count = 0;
			foreach($array as $split)
			{
				if (strpos($split,'%') == false)
				{
					$variable[$count++] = str_replace(");", "" ,$split);
				}
			}
			return $variable;
		}
		
		//Hàm lấy ra các tham số -- Trả về mảng chứa các tham số
		function get_parameter($code)
		{			
			//Lấy ra các tham số bỏ vào mảng pa
			preg_match_all(rex_for_format_specifiers(),$code, $parameter);			
				
			return $parameter[0];
		}
		
		//Hàm check xem số tham số có bằng số biến không
		function is_valid( $num_para, $num_var)
		{
			if($num_para != $num_var)
				return "false";			
		}
		
		//Hàm gắn biến vào tham số
		function join_var_to_para( $array_para, $array_var, $str)
		{
			$temp = 0;
			for($i = 0; $i < count($array_para); $i++)
			{
				//Lấy ra vị trí đầu tiên
				$pos = stripos($str, $array_para[$i] );
				
				$final_str .= substr($str, 0, $pos).'" << '.trim($array_var[$i]).' << "';
					
				$str = substr($str, $pos + strlen($array_para[$i]));
				if(preg_match(rex_for_format_specifiers(), $str) == 0)
				{
					$final_str .= $str.' <<endl';
					$temp = 1;
				}
			}
			if( $temp == 0)
				$final_str = substr_replace($final_str,"endl", -1 );
			return $final_str;
		}
		
		//Hàm convert các hàm printf scanf puts gets c sang c++
		function convert_IO($code, $type)
		{
			if($type != "gets" && $type != "puts")
			{
				//Lấy ra chuỗi string
				preg_match(rex_for_get_string(), $code, $str );
				//Lấy ra vị trí của chuỗi string
				$pos = stripos($code, $str[0]);
				//Lấy chuỗi còn lại
				$begin_str = substr($code, $pos + strlen($str[0])+1);
				
				$parameter = get_parameter($str[0]);//Lấy ra mảng tham số
				$variable = get_variable($begin_str);//Lấy ra mảng biến
				
				// Trường hợp I/O là printf
				if($type == "printf"){
					if(is_valid(count($parameter), count($variable)) == "false")
						return "false";					
					else 
						$final_str = join_var_to_para($parameter, $variable, $str[0]);					
				}
				// Trường hợp I/O là scanf
				else if($type == "scanf"){			
					for($i = 1; $i < count($str); $i++){
						$final_str .= " >> ".$str[$i];
					}							
				}
			}
			else
			{	// Lấy đoạn string trước đấu phẩy đầu tiên và sau dấu (
				$begin_str = substr(substr($code, 5), 0, -2);
				if($type == "puts"){				
					$final_str = get_cpluskey("puts").$begin_str;
				}
				else if($type == "gets"){
					$final_str = get_cpluskey("gets").$begin_str;
				}
			}
			$final_str = str_replace('"" <<',"", $final_str);
			return $final_str.";";
		}
		
		function keywords()
		{
			$kws = array("auto", "double", "int", "struct", "break", "long",
					"enum", "register", "typedef", "char", "extern", "union",
					"const", "float", "short", "unsigned", "continue", "signed",
					"default", "goto", "sizeof", "volatile", "static","return","delete");
			return $kws;
		}
		
		function calculations()
		{
			$ccls = array("+", "-", "*", "/", "->", "(", ")", "[", "]", "=");
			return $ccls;
		}
?>